#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>


/**
 * 测试一下 getsid setsid
 * @return
 */
//int main() {
//    pid_t pid = -1;
//    //获取当前的会话
//    pid = getsid(0);
//    printf("sid : %d!\n",pid);
//    //直接报错了，当前进程是一个进程组的组长，创建会话会报错的
//    pid = setsid();
//    if(-1 == pid){
//        perror("setsid");
//        return 1;
//    }
//    printf("newsid : %d\n",pid);
//    return 0;
//}

/**
 * 创建 守护进程
 * @return
 */
//int main() {
//    pid_t pid = -1;
//    int ret = -1;
//    // 创建子进程 父进程退出（必须）
//    pid = fork();
//    if(pid == -1){
//        perror("fork");
//        return 1;
//    }
//    if(pid != 0){
//        printf("parent exit\n");
//        exit(0);
//    }
//    // 在子进程中创建新的会话（必须） 完全脱离了控制终端
//    pid = setsid();
//    if(pid == -1){
//        perror("setsid");
//        return 1;
//    }
//    // 改变当前目录 一般为根目录（非必须）
//    ret = chdir("/");
//    if(-1 == ret){
//        perror("chdir");
//        return 1;
//    }
//    // 重设文件权限掩码（非必须）增加守护进程的灵活性
//    umask(0);
//    // 关闭文件描述符（非必须）
//    close(STDIN_FILENO);
//    close(STDOUT_FILENO);
//    close(STDERR_FILENO);
//    // 开始执行守护进程核心工作（必须）
//    // 每隔一1秒将当前时间保存到 /temp/txt.log 文件中
//    while(1){
//        system("date >> /home/wanghaichen/codes/linux_system_codes/deamon_process/txt.log");
//        sleep(1);
//    }
//    return 0;
//}

/**
 * 获取当前系统时间
 * @return
 */
#define SIZE 256
//int main() {
//
//    time_t t = -1;
//    struct tm * pt = NULL;
//    char filename[SIZE];
//    // 获取系统当前时间，从1970.1.1.0.0.0开始的秒数
//    t = time(NULL);
//    if(t == -1){
//        perror("time");
//        return 1;
//    }
//    printf("t : %ld\n",t);
//    //                            返回 Thu Feb  9 13:48:35 2023
//    printf("ctime : %s\n", ctime(&t));
//    //   转化为时间
//    pt = localtime(&t);
//    if(pt == NULL){
//        printf("localtime failed\n");
//        return 1;
//    }
//    printf("year : %d\n",pt->tm_year + 1900);
//    printf("month : %d\n",pt->tm_mon + 1);
//    printf("day : %d\n",pt->tm_mday);
//    printf("hour : %d\n",pt->tm_hour);
//    printf("minite : %d\n",pt->tm_min);
//    printf("second : %d\n",pt->tm_sec);
//
//    memset(filename,0,SIZE);
//    sprintf(filename,"%s %d%d%d%d%d%d.log","touch",pt->tm_year + 1900,pt->tm_mon + 1,pt->tm_mday,pt->tm_hour,pt->tm_min,pt->tm_sec);
//    printf("filename: %s\n",filename);
//    system(filename);
//
//    return 0;
//}

/**
 * 利用守护进程 进行创建文件
 * @return
 */
int main() {
    time_t t = -1;
    struct tm * pt = NULL;
    char filename[SIZE];
    pid_t pid = -1;
    int ret = -1;
    // 创建子进程 父进程退出（必须）
    pid = fork();
    if(pid == -1){
        perror("fork");
        return 1;
    }
    if(pid != 0){
        printf("parent exit\n");
        exit(0);
    }
    // 在子进程中创建新的会话（必须） 完全脱离了控制终端
    pid = setsid();
    if(pid == -1){
        perror("setsid");
        return 1;
    }
    // 改变当前目录 一般为根目录（非必须）
    ret = chdir("/");
    if(-1 == ret){
        perror("chdir");
        return 1;
    }
    // 重设文件权限掩码（非必须）增加守护进程的灵活性
    umask(0);
    // 关闭文件描述符（非必须）
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    // 开始执行守护进程核心工作（必须）
    // 每隔一1秒将当前时间保存到 /temp/txt.log 文件中
    while(1){
        t = time(NULL);
        if(t == -1){
            perror("time");
            return 1;
        }
        //   转化为时间
        pt = localtime(&t);
        if(pt == NULL){
            printf("localtime failed\n");
            return 1;
        }
        memset(filename,0,SIZE);
        sprintf(filename,"%s%d%d%d%d%d%d.log","touch /home/wanghaichen/codes/linux_system_codes/deamon_process/",pt->tm_year + 1900,pt->tm_mon + 1,pt->tm_mday,pt->tm_hour,pt->tm_min,pt->tm_sec);

        system(filename);
        sleep(4);
    }
    return 0;
}
